package main

//引入包
import (
	"fmt"
	"unsafe"
)

//第一种，指定变量类型，声明后若不赋值，使用默认值
var str string
//第二种，根据值自行判定变量类型。
var a = 1
var b float32 = 1.0
var c = "abc"
var d bool = false

var (  // 这种因式分解关键字的写法一般用于声明全局变量
	x int
	y float32
	boo bool
)
//函数
func main() {
	str = "张三"

	//第三种，省略var, 注意 :=左侧的变量不应该是已经声明过的，否则会导致编译错误。
	abc := "李四"
	x = 10
	y = 5.4
	c := 10
	y := 10.1
	e :=10
	b := 10.9

	fmt.Println(str, a, b, c, d, abc, x, y, boo, e)

	//类似java final
	const LENGTH int = 10
	const WIDTH int = 5
	var area int
	const aaa, bbb, ccc = 1, false, "str" //多重赋值

	area = LENGTH * WIDTH
	fmt.Printf("面积为 : %d", area)
	fmt.Println()
	fmt.Println(aaa, bbb, ccc)
	cc := unsafe.Sizeof(ccc)
	fmt.Println(cc)

	const (
		a1 = iota
		b1
		c1
	)
	fmt.Println(a1, b1, c1)

	const (
		a2 = iota   //0
		b2          //1
		c2          //2
		d2 = "ha"   //独立值，iota += 1
		e2          //"ha"   iota += 1
		f2 = 100    //iota +=1
		g2          //100  iota +=1
		h2 = iota   //7,恢复计数
		i2          //8
	)
	fmt.Println(a2,b2,c2,d2,e2,f2,g2,h2,i2)

	const (
		i=1<<iota
		j=3<<iota
		k
		l
	)

	fmt.Println(i, j, k, l)
}
